package me.keiwu.pub.util.wx;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;

import me.keiwu.pub.data.enums.*;
import me.keiwu.pub.data.service.UserInfoBean;
import me.keiwu.pub.data.wx.WXTemplateData;

/**
 * Created by kei on 09/02/2018.
 */
@Component
public class TemplateMsgUtil {

	@Value("${wx.appId}")
	private String appId;
	@Value("${wx.secret}")
	private String secret;

	// 挑战邀请（好友接受挑战通知）
	@Value("${wx.challengeAccept}")
	private String challengeAccept;

	// 挑战结果
	@Value("${wx.challengeResults}")
	private String challengeResults;

	// 用户5天没有登录，发送通知
	@Value("${wx.activeStep}")
	private String activeStep;

	// 账户变动提醒
	@Value("${wx.goldChanged}")
	private String goldChanged;

	// 留言回复通知
	@Value("${wx.msgReply}")
	private String msgReply;

	// 比赛邀请通知
	@Value("${wx.challengeCreated}")
	private String challengeCreated;

	@Value("${wx.fillDeliveryAddress}")
	private String fillDeliveryAddress;

	@Autowired
	private AccessTokenUtil accessTokenUtil;

//	@Autowired
//	private UserRpcPub userRpcPub;

	// offset count
	private static final String SIMPLE_LIST_API = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list";

	// id keyword_id_list
	private static final String ADD_API = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add";

	// template_id
	private static final String DELETE_API = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del";

	/**
	 * touser 是 接收者（用户）的 openid template_id 是 所需下发的模板消息的id page 否
	 * 点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转。 form_id 是
	 * 表单提交场景下，为 submit 事件带上的 formId；支付场景下，为本次支付的 prepay_id data 是 模板内容，不填则下发空模板
	 * color 否 模板内容字体的颜色，不填默认黑色 emphasis_keyword 否
	 */
	private static final String SEND_API = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send";

	// 根据枚举值获取不同的模板消息 先保存这个方法，以防在其他地方单独用到
	public String getTemplateMsgId(int templateType) {
		// 获取状态
		TemplateMsgType templateMsgType = TemplateMsgType.parse(templateType);
		String type = null;
		// 获取模板消息的id
		switch (templateMsgType) {
		case CHALLENGE_ACCEPT:
			type = challengeAccept;
			break;
		case CHALLENGE_RESULTS:
			type = challengeResults;
			break;
		case ACTIVE_STEP:
			type = activeStep;
			break;
		case GOLD_CHANGED:
			type = goldChanged;
			break;
		case MSG_REPLY:
			type = msgReply;
			break;
		case CHALLENGE_CREATED:
			type = challengeCreated;
			break;
		case FILL_ADDRESS:
			type = fillDeliveryAddress;
			break;
		default:
			break;
		}
		return type;
	}

	// 获取requestUrl
	public String getRequestUrl() {
		// 获取accessToken
		String accessToken = accessTokenUtil.getAccessToken(appId, secret);
		// requestUrl
		String requestUrl = SEND_API + "?access_token=" + accessToken;
		return requestUrl;
	}

	/**
	 * @param fromUserJsonStr UserBean的Json字符串，模板消息的发起方，例如A挖了B的金币，发起方就是A，可以为空
	 * @param toUserJsonStr UserBean的Json字符串，模板消息的接收方
	 * @param paramMap 附加参数列表，在不同的模板消息类型会有变化
	 *                 固定参数:	templateMsgType int			消息类型
	 *                 			formId			string		formId
	 *                 可选参数:	goldCount		int			金币数
	 *                 			challengeName	String		挑战名称
	 *                 			endTime			String		挑战结束时间
	 *
	 * @return 模板消息
	 */
	public Map<String, Object> getTemplate(String fromUserJsonStr, String toUserJsonStr,Map<String, Object> paramMap){

		UserInfoBean userSelf = JSONObject.parseObject(fromUserJsonStr, UserInfoBean.class);
		UserInfoBean userOther = JSONObject.parseObject(toUserJsonStr, UserInfoBean.class);
		if (userOther != null){
			Map<String, Object> templateMap = new HashMap<String, Object>();
			String openId = userOther.getOpenId();
			int type = (int) paramMap.get("templateMsgType");
			String formId = (String) paramMap.get("formId");

			// data 设置内容模板
			Map<String, WXTemplateData> data = new HashMap<String, WXTemplateData>();
			// 获取状态
			TemplateMsgType templateMsgType = TemplateMsgType.parse(type);
			String templateId = getTemplateMsgId(type);
			WXTemplateData keyword1Data = null;
			WXTemplateData keyword2Data = null;
            WXTemplateData keyword3Data = null;
			WXTemplateData keyword4Data = null;
			WXTemplateData keyword5Data = null;
			// 模板需要方法的关键词。不填写则默认是无放大
			String emphasisKeyword = null;
            // 获取系统当前时间并进行格式转换
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            String timeNowStr = sdf.format(date);

			switch (templateMsgType){
				// 挑战邀请（好友接受挑战通知）
				case CHALLENGE_ACCEPT:
					if (userSelf != null){
						keyword1Data = new WXTemplateData();
						keyword2Data = new WXTemplateData();
						keyword1Data.setValue(userSelf.getNickName());
						keyword2Data.setValue("你的挑战已被对方接受，点击马上查看挑战详情");
						data.put("keyword1", keyword1Data);
						data.put("keyword2", keyword2Data);

					}else{
						data = null;
					}
					break;
				// 挑战结果
				case CHALLENGE_RESULTS:
					keyword1Data = new WXTemplateData();
					keyword2Data = new WXTemplateData();
					keyword3Data = new WXTemplateData();
					keyword4Data = new WXTemplateData();
					keyword5Data = new WXTemplateData();
					String initiator = (String) paramMap.get("initiator");
					String vsMsg = (String) paramMap.get("message");
					String result = (String) paramMap.get("result");
					String stepCount = ((Number)paramMap.get("step")).toString();
					String remark = (String) paramMap.get("remark");

					keyword1Data.setValue(initiator);
					keyword2Data.setValue(vsMsg);
					keyword3Data.setValue(stepCount);
					keyword4Data.setValue(result);
					if (result.equalsIgnoreCase("胜利")) {
						keyword4Data.setColor("#fecd52");
					}else if (result.equalsIgnoreCase("平局")) {
//						keyword4Data.setColor("#c04b68");
					}else {
						keyword4Data.setColor("#c04b68");
					}


					keyword5Data.setValue(remark);

					data.put("keyword1", keyword1Data);
					data.put("keyword2", keyword2Data);
					data.put("keyword3", keyword3Data);
					data.put("keyword4", keyword4Data);
					data.put("keyword5", keyword5Data);

					emphasisKeyword = "keyword4.DATA";
					break;
				// 用户5天没有登录，发送通知
				case ACTIVE_STEP:
					keyword1Data = new WXTemplateData();
					keyword2Data = new WXTemplateData();

					keyword1Data.setValue(timeNowStr);
					keyword2Data.setValue("今天的步数已生成，马上点击查看今天运动步数，快用今天的健康能量兑换星币吧！");
                    data.put("keyword1", keyword1Data);
                    data.put("keyword2", keyword2Data);
					break;
				// 账户变动提醒
				case GOLD_CHANGED:
					if (userSelf != null){
						keyword1Data = new WXTemplateData();
						keyword2Data = new WXTemplateData();
						keyword3Data = new WXTemplateData();

						int goldCount = (int) paramMap.get("goldCount");
						keyword1Data.setValue(userSelf.getNickName() + "刚刚在你的星球获取了" + goldCount + "个星币");
						keyword2Data.setValue(timeNowStr);
						keyword3Data.setValue("点击马上查看对方星球详情");

						data.put("keyword1", keyword1Data);
						data.put("keyword2", keyword2Data);
						data.put("keyword3", keyword3Data);

					}else {
						data = null;
					}
					break;
				// 留言回复通知
				case MSG_REPLY:
					if (userSelf != null){
						keyword1Data = new WXTemplateData();
						keyword2Data = new WXTemplateData();
						// 打招呼者
						keyword1Data.setValue(userSelf.getNickName());
						keyword2Data.setValue("你的附近星球好友向你打了个招呼，可点击查看留言");
						data.put("keyword1", keyword1Data);
						data.put("keyword2", keyword2Data);

					}else {
						data = null;
					}

					break;
				// 比赛邀请通知
				case CHALLENGE_CREATED:
					if (userSelf != null) {
						keyword1Data = new WXTemplateData();
						keyword2Data = new WXTemplateData();
						keyword3Data = new WXTemplateData();

						// 获取挑战的名称
						keyword1Data.setValue((String) paramMap.get("challengeName"));
						// 自己的昵称
						keyword2Data.setValue(userSelf.getNickName());
						// 获取挑战过期时间
						keyword3Data.setValue((String) paramMap.get("endTime"));
						data.put("keyword1", keyword1Data);
						data.put("keyword2", keyword2Data);
						data.put("keyword3", keyword3Data);

					}else {
						data = null;
					}

					break;
				case FILL_ADDRESS:
					keyword1Data = new WXTemplateData();
					keyword2Data = new WXTemplateData();
					keyword3Data = new WXTemplateData();
					keyword1Data.setValue("小宇宙Heli");
					keyword2Data.setValue((String) paramMap.get("keyword2"));
//					keyword3Data.setValue("恭喜你在排行榜活动送大奖中获胜，请点击本消息填写你的收货信息，我们将在本月内安排奖品配送，谢谢");
					keyword3Data.setValue((String) paramMap.get("keyword3"));
					data.put("keyword1", keyword1Data);
					data.put("keyword2", keyword2Data);
					data.put("keyword3", keyword3Data);
					break;
				default:
					data = null;
					break;
			}
			if (data == null){
				return null;
			}

			// 保存到集合中
			templateMap.put("openId", openId);
			templateMap.put("templateId", templateId);
			templateMap.put("formId", formId);
			templateMap.put("data", data);
			templateMap.put("emphasisKeyword", emphasisKeyword);
			return templateMap;
		}
		return null;
	}

}
